﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using produccion.clases;
using System.Windows.Media.Imaging;
using System.Collections.ObjectModel;
using produccion.AccesoDatos;
using System.Windows.Input;
using System.Windows;

namespace produccion.vistamodelo
{
    public class VMbuscarReferencia:ViewModelBase
    {

        #region constructors
        public VMbuscarReferencia() 
        {
         
        }
        #endregion

        #region fields

        private CLSMAEREF _referencia = new CLSMAEREF();
        private ProcesoProduccionRepositorio _rep = new ProcesoProduccionRepositorio();
        public delegate void ResultadoBusqueda(List<string> lisRef);
                     
        #endregion

        #region public interfaces
  
        public string strBuscar 
        {
            get { return _referencia.NOMREF_REF; }
            set 
            { 
                _referencia.NOMREF_REF = value;
                ConsultarReferencia();            
                base.OnPropertyChanged("strBuscar");
            }        
        }

        private ObservableCollection<VMreferencia> _lisReferencias=new ObservableCollection<VMreferencia>();
        public ObservableCollection<VMreferencia> lisReferencias 
        {
            get { return _lisReferencias; }
            set { _lisReferencias = value; base.OnPropertyChanged("lisReferencias"); }
        }

        private VMreferencia _selReferencia = new VMreferencia();
        public VMreferencia selReferencia 
        {
            get { return _selReferencia; }
            set 
            { 
                _selReferencia = value;
                visorReferencia.strCodigo =_selReferencia!=null?_selReferencia.strCodigo:null;
                ConsultarColor();
                base.OnPropertyChanged("selReferencia");
            }
        }

        private ObservableCollection<VMcolor> _lisColores = new ObservableCollection<VMcolor>();
        public ObservableCollection<VMcolor> lisColores 
        {
            get { return _lisColores; }
            set { _lisColores = value; base.OnPropertyChanged("lisColores"); }
        }

        private VMcolor _selColor = new VMcolor();
        public VMcolor selColor
        {
            get { return _selColor; }
            set
            {
                _selColor = value;
                visorReferencia.strColor =  _selColor != null ?  _selColor.strCodigo : null;
                base.OnPropertyChanged("selColor");
            }
        }

        private Boolean _logTodos = false;
        public Boolean logTodos
        {
            get { return _logTodos; }
            set
            {
                _logTodos = value;
                if (_logTodos)
                {
                    selTodoslosColores();
                }
                else
                {
                    selNingunColor();
                }
                base.OnPropertyChanged("logTodos");
            }
        }

        private VMvisorFotoReferencia _visorReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorReferencia
        {
            get { return _visorReferencia; }
            set { _visorReferencia = value; base.OnPropertyChanged("visorReferencia"); }
        }

        private List<string> _listaProducto = new List<string>();
        public List<string> listaProducto 
        {
            get { return _listaProducto; }
            set { _listaProducto = value; base.OnPropertyChanged("listaProducto"); }
        }

        private bool _tieneColor = false;
        public bool TieneColor
        {
            get { return _tieneColor;}
            set { _tieneColor = value; base.OnPropertyChanged("TieneColor"); } 
        }

        private bool _IsOpen = false;
        public bool IsOpen 
        {
            get { return _IsOpen; }
            set { _IsOpen = value; base.OnPropertyChanged("IsOpen"); }
        }

        RelayCommand _cmdAceptar;
        public ICommand cmdAceptar
        {
            get
            {
                if (_cmdAceptar == null)
                {
                    _cmdAceptar = new RelayCommand(r => Aceptar());
                }
                return _cmdAceptar;
            }
        }

        RelayCommand _cmdSalir;
        public ICommand cmdSalir
        {
            get
            {

                if (_cmdSalir == null)
                {
                    _cmdSalir = new RelayCommand(r => Salir());
                }
                return _cmdSalir;
            }
        }

        #endregion

        #region metodos

        private void ConsultarReferencia() 
        {
            try {

                if (String.IsNullOrEmpty(strBuscar)) 
                {
                    lisReferencias.Clear();
                    return;
                }
         
                List<CLSMAEREF> lista = _rep.BuscarReferencia(_referencia);
                List<VMreferencia> all = (from cust in lista select new VMreferencia(cust)).ToList();
                lisReferencias = new ObservableCollection<VMreferencia>(all);         
            }
            catch (Exception ex) { throw ex; }
        }

        private void ConsultarColor() 
        {
            try 
            {
                if (TieneColor == false) 
                {
                    return;
                }
                if (selReferencia==null)
                {
                    lisColores.Clear();
                    return;
                }
                List<CLSMAECOL> lista = _rep.ConsultarColorReferencia(selReferencia.getReferencia());
                List<VMcolor> all = (from cust in lista select new VMcolor(cust)).ToList();
                lisColores = new ObservableCollection<VMcolor>(all);         
            }
            catch (Exception ex) { throw ex; }
        }

        private void selTodoslosColores()
        {
            foreach (VMcolor col in lisColores)
            {
                col.logSeleccion = true;
            }
        }

        private void selNingunColor()
        {
            foreach (VMcolor col in lisColores)
            {
                col.logSeleccion = false;
            }
        }

        public void Aceptar() 
        {
            try 
            {
                List<string> lr = new List<string>();
                if (selReferencia != null) 
                {
                    if (TieneColor)
                    {
                        lr = (from cust in lisColores where cust.logSeleccion.Equals(true) select selReferencia.strCodigo+cust.strCodigo).ToList();
                    }
                    else {
                        lr.Add(selReferencia.strCodigo);
                    }
                    listaProducto = lr;
                }
                Salir();
             }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void Salir() 
        {
            try 
            {
                lisColores.Clear();
                //lisReferencias.Clear();
                //visorReferencia.strCodigo = null;
                //strBuscar = "";
                IsOpen = false;
                listaProducto.Clear();

            }
            catch (Exception ex) { throw ex; }
        }
     
                
        #endregion
        
    }

    public class VMreferencia : ViewModelBase 
    { 
    
        #region constructors

        public VMreferencia(CLSMAEREF referencia)
        {
            try {
                _referencia = referencia;
             }
            catch (Exception ex) { throw ex; }
        }

        public VMreferencia()
        {
            try
            {
            
            }
            catch (Exception ex) { throw ex; }
        }

        #endregion
    
        #region fields
        private CLSMAEREF _referencia = new CLSMAEREF();
        #endregion

        #region public interfaces
       
        public string strCodigo 
        {
            get { return _referencia.CODREF_REF; }
            set { _referencia.CODREF_REF = value;  base.OnPropertyChanged("strCodigo"); }
        }

        public string strNombre 
        {
            get { return _referencia.NOMREF_REF; }
            set { _referencia.NOMREF_REF = value; base.OnPropertyChanged("strNombre"); }
        }

        public string strNombreProveedor
        {
            get { return _referencia.infproveedor.NOMPRV_PRV; }
            set { _referencia.infproveedor.NOMPRV_PRV = value; base.OnPropertyChanged("strNombreProveedor"); }
        }
              
        #endregion

        #region methods
        public CLSMAEREF getReferencia() 
        {
            return _referencia;
        }
        #endregion

    }

    public class VMcolor : ViewModelBase
    {
        #region constructors

        public VMcolor(CLSMAECOL color)
        {
            try 
            {
                _color = color;
            }
            catch (Exception ex) { throw ex; }
        }

        public VMcolor()
        {
            try
            {
            
            }
            catch (Exception ex) { throw ex; }
        }

        #endregion
    
        #region fields
        private CLSMAECOL _color = new CLSMAECOL();
        #endregion

        #region public interfaces
       
        public string strCodigo 
        {
            get { return _color.CODCOL_COL; }
            set { _color.CODCOL_COL = value; base.OnPropertyChanged("strCodigo"); }
        }

        public string strNombre 
        {
            get { return _color.NOMCOL_COL; }
            set { _color.NOMCOL_COL= value; base.OnPropertyChanged("strNombre"); }
        }

        private bool _logSeleccion = false;
        public bool logSeleccion 
        {
            get { return _logSeleccion; }
            set { _logSeleccion = value; base.OnPropertyChanged("logSeleccion"); }
        }

        #endregion
    }
    
}
